<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 计算 1+2+3+....+n 的和
        // 方法1--循环
        var sum = 0;
        var n = 10;
        for (var i = 1; i <= n; i++) {
            sum += i;
        }
        console.log(sum);
        // 方法2--递归
        function getSum(n) {
            if (n == 1) return 1;
            return n + getSum(n - 1);
        }
        console.log(getSum(10));

        // 做同样一件事的时候---可以使用递归，但一定要有跳出的条件！！！(否则死循环)
        // function f() {
        //     console.log(1);
        //     f();
        // }
        // f();
        // 内存溢出：超出堆栈大小
        var index = 1;
        function fnSelf() {
            if (index < 100) { //跳出循环的条件
                index++;
                fnSelf();
            }
        }
        fnSelf();

        // 案例1——阶乘 n!=n*(n-1)!
        function jieCheng(n) {
            if (n === 0 || n === 1) return 1;
            return n * jieCheng(n - 1);
        }
        //案例2.1——斐波那契数列  1, 1, 2, 3, 5, 8, 13, 21, 34 …
        function fn(n) {
            if (n == 1 || n == 2) return 1;
            return fn(n - 1) + fn(n - 2);
        }
        //案例2.2——斐波那契之第几个参数的值
        function getNthFibonacci(count) {
            // 参数判断
            var count = parseInt(count);
            if (isNaN(count) || count < 0) {
                return 0;
            }
            function fibonacci(count) {
                if (count <= 1) return 1;
                return fibonacci(count - 1) + fibonacci(count - 2);
            }
            return fibonacci(count);
        }

    </script>
</body>
</html>